package com.biz.primus.ms.payment.channel.allinpay.req;

import com.biz.primus.ms.payment.channel.allinpay.res.AllInPayScanPayRespVo;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.Getter;
import lombok.Setter;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;
import java.util.TreeSet;
import java.util.UUID;

/**
 * AllInPayScanPay
 *
 * @author JKLiues
 * @date 2017年11月16日
 */
@Getter
@Setter
public class AllInPayScanPay extends AllInPayRequestBase {
    private static final String API_URL = "https://vsp.allinpay.com/apiweb/unitorder/scanpay";


    /**
     * 商户号	平台分配的商户号
     */
    private String cusid;
    /**
     * 应用ID	平台分配的APPID
     */
    private String appid;
    /**
     * 版本号	接口版本号
     */
    private Long version = 1L;
    /**
     * 交易金额	单位为分
     */
    private Integer trxamt;
    /**
     * 商户交易单号	商户的交易订单号
     */
    private String reqsn;
    /**
     * 交易方式	详见附录3.3 交易方式
     */
    private String paytype;
    /**
     * 随机字符串	商户自行生成的随机字符串
     */
    private String randomstr = UUID.randomUUID().toString();
    /**
     * 订单标题	订单商品名称，为空则以商户名作为商品名称
     */
    private String body;
    /**
     * 备注	备注信息
     */
    private String remark;
    /**
     * 有效时间	订单有效时间，以分为单位，不填默认为15分钟
     */
    private String validtime;
    /**
     * 支付授权码	微信或者支付宝的被扫刷卡支付时,用户的付款二维码
     */
    private String authcode;
    /**
     * 支付限制	no_credit--指定不能使用信用卡支付
     */
    private String limit_pay;

    @Override
    protected String getApiUrl() {
        return API_URL;
    }

    @Override
    public TreeSet<String> getSignParams() {
        return Sets.newTreeSet(Lists.newArrayList(
                "cusid",
                "appid",
                "version",
                "randomstr",
                "trxamt",
                "reqsn",
                "body",
                "remark",
                "authcode",
                "limit_pay"
        ));
    }

    public AllInPayScanPayRespVo execute(String sign) {
        Map<String, Object> map = new HashMap<>();
        map.put("cusid", this.cusid);
        map.put("appid", this.appid);
        map.put("version", this.version);
        map.put("randomstr", this.randomstr);
        map.put("trxamt", this.trxamt);
        map.put("reqsn", this.reqsn);
        map.put("body", this.body);
        map.put("remark", this.remark);
        map.put("authcode", this.authcode);
        map.put("limit_pay", this.limit_pay);
        map.put("sign", sign);
        RestTemplate restTemplate = getRestTemplate();
        return restTemplate.postForObject(getApiUrl(), map, AllInPayScanPayRespVo.class);
    }
}